package com.lg.head_first.chap01.duck;

/**
 * 设计模式 入门: Duck 类
 * 用于 Java中面对接口编程的优点
 * <p>
 * 设计的一款鸭子游戏
 *
 * @author by Mr. Li 2020/7/22 20:55
 */
public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    /**
     * 提供Seeter 方法 ,以后可以动态添加行为
     * @param flyBehavior
     */
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
    //public void quack() { // 抽取
    //    System.out.println("嘎嘎嘎~~~");
    //}

    public void swim() {
        System.out.println("swimming~~~");
    }

    /**
     * 将具体的行为 委托给行为类
     */
    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    /**
     * 第一次增加需求:让所有的鸭子都能飞
     */
    //public void fly(){  抽取
    //    System.out.println("i can fly~~~");
    //}

    /**
     * 针对不同的鸭子会有不同的功能,提供一个抽象方法,下放到具体的子类中实现
     */
    public abstract void display();
}
